
Layer指定使用哪種 activation 有下列方式 (這邊皆以 "relu" 來做範例) :
(1) 指定函式名稱 'relu' (內建 預設)
範例程式:
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers 
from tensorflow.keras.models import Model
model = Sequential([
 layers.Dense(10, activation="relu")
 ])
依照範例程式之指定函式名稱'relu',會經過以下函式:
 keras.activations.get 
 -> keras.activations.deserialize 
 -> keras.saving.serialization_lib.deserialize_keras_object 
 -> keras.saving.serialization_lib.serialize_with_public_fn 
 -> keras.saving.serialization_lib._retrieve_class_or_fn
要注意的是,透過 keras.saving.serialization_lib.serialize_with_public_fn 將資訊包成 dict 字串,
 字串內容為{'class_name': 'function', 'config': 'relu', 'module': 'keras.activations', 'registered_name': 'relu'} ,
 並傳入 keras.saving.serialization_lib._retrieve_class_or_fn 並指定 obj_type = 'function',接著回傳 activation 物件。
(2) 指定類別名稱 'ReLU' (內建 預設)
範例程式:
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers 
from tensorflow.keras.models import Model
model = Sequential([
 layers.Dense(10, activation="ReLU")
 ])
注意大小寫名稱。
依照範例程式之指定函式名稱'ReLU',會經過以下函式:
 keras.activations.get 
 -> keras.activations.deserialize 
 -> keras.saving.serialization_lib.deserialize_keras_object 
 -> keras.saving.serialization_lib.serialize_with_public_class 
 -> keras.saving.serialization_lib._retrieve_class_or_fn 
這邊是透過 keras.saving.serialization_lib.serialize_with_public_class 將資訊包成 dict 字串,
字串內容為{'class_name': 'ReLU', 'config': None, 'module': 'keras.layers', 'registered_name': None} ,
 並傳入 keras.saving.serialization_lib._retrieve_class_or_fn 並指定 obj_type = 'class',接著回傳 activation 物件。
其實 指定 'relu' 和 'ReLU' 是一樣的。 只是一種是直接使用函式轉換,另一種是利用實作類別的call function來使用。
而 (1)(2) 此二種都會經由一個 mapping 來找出對應的activation物件。其mapping的內容如下:
class:
 'ELU': keras.layers.activation.elu.ELU
 'LeakyReLU': keras.layers.activation.leaky_relu.LeakyReLU 
 'PReLU': keras.layers.activation.prelu.PReLU
 'ReLU': keras.layers.activation.relu.ReLU
 'Softmax': keras.layers.activation.softmax.Softmax
 'ThresholdedReLU': keras.layers.activation.thresholded_relu.ThresholdedReLU
 
function:
 'elu' : keras.activations.elu
 'linear' : keras.activations.linear
 'exponential' : keras.activations.exponential
 'gelu' : keras.activations.gelu
 'hard_sigmoid' : keras.activations.hard_sigmoid
 'leaky_relu' : keras.activations.leaky_relu
 'mish' : keras.activations.mish
 'relu' : keras.activations.relu
 'selu' : keras.activations.selu
 'sigmoid' : keras.activations.sigmoid
 'silu' : keras.activations.silu
 'softmax' : keras.activations.softmax
 'softplus' : keras.activations.softplus
 'softsign' : keras.activations.softsign
 'swish' : keras.activations.swish
 'tanh' : keras.activations.tanh
(3) 自定義類別
範例程式:
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.models import Model
class MyReLU(layers.Layer):
    def __init__(self, max_value=None, negative_slope=0.0, threshold=0.0, **kwargs):
        super().__init__(**kwargs)
        self.DefinedFunction = layers.ReLU(max_value, negative_slope, threshold)
        
    def call(self, inputs):
        return self.DefinedFunction.call(inputs)
model = Sequential([
layers.Dense(10, activation= MyReLU(max_value=None, negative_slope=0.0, threshold=0.0) )
])
此範例展示自定義activation類別,必須繼承 keras.layers.Layer , 並實作 init 與 call 函式。 call函式會因為 父類別__call__的轉換而被呼叫。而此範例只是再利用內建的relu,目的為做簡單的自定義例子來展現必須實作之處。
所以如果要自定義activation類別,可以實作此call函式,將要轉換的公式至於此,並記得回傳透過公式轉換之結果。
(4) 直接使用內建類別
範例程式:
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers 
from tensorflow.keras.models import Model
model = Sequential([
 layers.Dense(10, activation= layers.ReLU(max_value=None, negative_slope=0.0, threshold=0.0))
 ])
第四個範例直接使用內建類別,可以直接試試看,不再詳細敘述。
以上是幾種取得並設定activation的方式,紀錄於此。